package com.ffggffgfv.backend.mapper;

import com.ffggffgfv.backend.dto.OrderQueryDTO;
import com.ffggffgfv.backend.entity.Order;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 订单数据访问层
 */
@Mapper
public interface OrderMapper {

    /**
     * 插入订单
     *
     * @param order 订单对象
     * @return 影响行数
     */
    int insert(Order order);

    /**
     * 根据ID查询订单
     *
     * @param id 订单ID
     * @return 订单对象
     */
    Order selectById(Long id);

    /**
     * 根据订单编号查询订单
     *
     * @param orderNo 订单编号
     * @return 订单对象
     */
    Order selectByOrderNo(String orderNo);

    /**
     * 查询用户的订单列表
     *
     * @param userId 用户ID
     * @return 订单列表
     */
    List<Order> selectByUserId(Long userId);

    /**
     * 条件分页查询订单
     *
     * @param queryDTO 查询条件
     * @param offset   起始位置
     * @param limit    查询数量
     * @return 订单列表
     */
    List<Order> selectByCondition(@Param("query") OrderQueryDTO queryDTO,
                                  @Param("offset") int offset,
                                  @Param("limit") int limit);

    /**
     * 查询符合条件的订单总数
     *
     * @param queryDTO 查询条件
     * @return 订单总数
     */
    long countByCondition(@Param("query") OrderQueryDTO queryDTO);

    /**
     * 更新订单
     *
     * @param order 订单对象
     * @return 影响行数
     */
    int update(Order order);

    /**
     * 更新订单状态
     *
     * @param orderNo   订单编号
     * @param oldStatus 旧状态
     * @param newStatus 新状态
     * @return 影响行数
     */
    int updateStatus(@Param("orderNo") String orderNo,
                     @Param("oldStatus") Integer oldStatus,
                     @Param("newStatus") Integer newStatus);

    /**
     * 关闭超时未支付的订单
     *
     * @param timeoutTime 超时时间
     * @return 影响行数
     */
    int closeTimeoutOrders(@Param("timeoutTime") java.util.Date timeoutTime);

    /**
     * 统计商家的订单数量
     *
     * @param merchantId 商家ID
     * @return 订单数量
     */
    int countByMerchantId(Long merchantId);

    /**
     * 统计商家特定状态的订单数量
     *
     * @param merchantId 商家ID
     * @param status     订单状态
     * @return 订单数量
     */
    int countByMerchantIdAndStatus(@Param("merchantId") Long merchantId, @Param("status") Integer status);

    /**
     * 按日期统计商家的订单
     *
     * @param merchantId 商家ID
     * @param days       天数
     * @return 订单统计结果
     */
    List<Map<String, Object>> statByMerchantIdGroupByDate(@Param("merchantId") Long merchantId, @Param("days") int days);
}
